/**
**********************************************************************************************************************************************************************************************************************************
* @file:	List.h
* @author:	zinface
* @date:	2021年09月25日 20:45:20 星期六
* @brief:	FinalC 提供的 List 数据集类型操作集
*
* 1. createList(): 创建空的 List 对象实例
* 2. createListWith_data(fpointer): 创建 List
*
* destroyList: 释放 List 对象
*
**********************************************************************************************************************************************************************************************************************************
**/

#ifndef __LIST__H__
#define __LIST__H__

#include "FinalC.h"

FinalC_Object_Define(List) {
    void *data;
    List *next;
    List *prev;
};
// FinalC_Object_Size(List);

#define FinalC_List_Func_Define(func) FinalC_Object_Func_Prefix(func, list)

// ------------------------------------ Constructor
/**
 * createList(): 创建空的 List 对象实例
 *
 */
FINALC_WARN_UNUSED_RESULT
FinalC_Object_Create_Define(List);

/**
 * createListWith_data(): 创建空的 List 对象实例
 *
 */
FINALC_WARN_UNUSED_RESULT
List *createListWith_data(fpointer data);

// ------------------------------------ Destructor
/**
 * destroyList: 释放 List 对象
 *
 * NOTE: 该对象结构指向的元素(如有)将不会进行释放，否则使用 deleteList()
 */
FinalC_Object_Destroy_Define(List);

/**
 * deleteList: 销毁 List 对象
 * 
 * NOTE: 该对象指向的内存(如有)将会进行释放
 */
// FinalC_Object_Delete_Define(List);
void deleteListWithFunc(List *list, FinalCDeleteFunc deleteFunc);

// ------------------------------------ Exstenstion Func: foreach
void finalc_list_foreach(List *list, FinalCFunc func, void *data);

/*******************************************************************/
// #define LIST_FOREACH(var, head, field)                  \
//     for((var) = LIST_FIRST(head);                       \
//         (var);                                          \
//         (var) = LIST_NEXT((var), field))

// FinalC List Foreach
#define list_foreach(var, head)                         \
    for((var) = head;                                   \
        (var);                                          \
        (var) = var->next)
/*******************************************************************/

// ------------------------------------ Exstenstion Func: Append
FINALC_WARN_UNUSED_RESULT
List *FinalC_List_Func_Define(Prepend)(List *list, fpointer data);
FINALC_WARN_UNUSED_RESULT
List *FinalC_List_Func_Define(Append)(List *list, fpointer data);

// ------------------------------------ Exstenstion Func: Length
int FinalC_List_Func_Define(Length)(List *list);

// ------------------------------------ Exstenstion Func: Index
List *FinalC_List_Func_Define(Index)(List *list, int index);

#endif  //!__LIST__H__
